#include <iostream>
#include <vector>
#include <string>
#include <unistd.h>

using namespace std;

#ifdef __cplusplus
extern "C"
{
    struct hero_inf
    {
        string hero_name;
        string hero_skill;
    };
}
#endif

// 英雄信息管理类
class heros_inf_manager
{
public:
    heros_inf_manager()
    {
        // 实例化一个 动态数组 容器对象来存储英雄信息
        this->heros_inf_v = new vector<struct hero_inf>();
        this->Mode_select();
    }

    ~heros_inf_manager()
    {
        // 释放动态数组容器对象的内存
        delete this->heros_inf_v;
    }

    bool Mode_select();   // 选择操作模式
    bool Add_Hero_Inf();  // 添加英雄信息
    bool Del_Hero_Inf();  // 删除英雄信息
    bool Show_Hero_Inf(); // 显示所有英雄信息

    // 查找英雄信息,返回迭代器(如果找到,返回迭代器指向该元素;如果未找到,返回迭代器指向容器的end())
    vector<struct hero_inf>::iterator Find_Hero_Inf();
    vector<struct hero_inf> *heros_inf_v; // 指向动态数组容器对象的指针
};

int main()
{
    heros_inf_manager heros_demo;
    return 0;
}

bool heros_inf_manager::Mode_select()
{
    int select_num;
    while (1)
    {
        cout << "英雄人物信息管理界面" << endl;
        cout << "1.添加英雄信息" << endl;
        cout << "2.删除英雄信息" << endl;
        cout << "3.显示所有英雄信息" << endl;
        cout << "4.查找英雄信息" << endl;
        cout << "5.退出程序" << endl;
        int choice;
        cin >> choice;
        switch (choice)
        {
        case 1:
            if(this->Add_Hero_Inf() == false)
            {
                cout<<"添加英雄信息失败"<<endl;
                return false;
            }
            else
            {
                cout<<"添加英雄信息成功"<<endl;
            }
            break;
        case 2:
            if(this->Del_Hero_Inf() == false)
            {
                cout<<"删除英雄信息失败"<<endl;
                return false;
            }
            else
            {
                cout<<"删除英雄信息成功"<<endl;
            }
            break;
        case 3:
            if(this->Show_Hero_Inf() == false)
            {
                cout<<"显示英雄信息失败"<<endl;
                return false;
            }
            else
            {
                cout<<"显示英雄信息成功"<<endl;
            }
            break;
        case 4:
            this->Find_Hero_Inf();
            break;
        case 5:
            cout << "程序退出" << endl;
            return true;
        default:
            cout << "输入错误,请重新输入" << endl;
            break;
        }

        sleep(1);

    }
    
    return true;
}

// 添加英雄信息
bool heros_inf_manager::Add_Hero_Inf()
{
    // 定义一个英雄结构体变量
    struct hero_inf hero;

    cout<<"请输入英雄姓名:"<<endl;
    cin>>hero.hero_name;

    cout<<"请输入英雄技能:"<<endl;
    cin>>hero.hero_skill;

    // 将结构体变量添加到动态数组容器中  值传递
    this->heros_inf_v->push_back(hero);
    
    return true;
}

// 删除英雄信息
bool heros_inf_manager::Del_Hero_Inf()
{
    // 定义一个英雄结构体变量
    struct hero_inf hero;

    cout<<"请输入要删除的英雄姓名:"<<endl;
    cin>>hero.hero_name;

    // 查找要删除的英雄信息
    auto it = this->Find_Hero_Inf();

    // 如果未找到要删除的英雄信息
    if(it == (vector<struct hero_inf>::iterator)nullptr)
    {
        cout<<"未找到要删除的英雄信息"<<endl;
        return true;
    }
    else
    {
        // 删除该英雄信息
        this->heros_inf_v->erase(it);
        cout<<"删除英雄信息成功"<<endl;
        return true;
    }
}


//查找英雄信息
vector<struct hero_inf>::iterator heros_inf_manager::Find_Hero_Inf()
{
    // 如果没有英雄信息
    if(this->heros_inf_v->empty())
    {
        cout<<"当前没有英雄信息"<<endl;
        return (vector<struct hero_inf>::iterator)nullptr; // 返回迭代器指向nullptr
    }

    string obj_hero_name; //目标英雄名称

    cout<<"请输入要查找的英雄姓名:"<<endl;
    cin>>obj_hero_name;

    //for(vector<struct hero_inf>::iterator it = this->heros_inf_v->begin(); it != this->heros_inf_v->end(); it++)
    for(auto it = this->heros_inf_v->begin(); it != this->heros_inf_v->end(); it++) //auto 自动类型推导
    {
        if(it->hero_name == obj_hero_name)
        {
            cout<<"找到英雄信息:"<<endl;
            cout<<"姓名:"<<it->hero_name<<endl;
            cout<<"技能:"<<it->hero_skill<<endl;
            return it; // 返回迭代器指向该元素(这里也就是结构体变量)
        }
    }
        cout<<"未找到要查找的英雄信息"<<endl;
    return (vector<struct hero_inf>::iterator)nullptr; // 返回迭代器指向nullptr
}


// 显示所有英雄信息
bool heros_inf_manager::Show_Hero_Inf()
{
    // 如果没有英雄信息
    if(this->heros_inf_v->empty())
    {
        cout<<"当前没有英雄信息"<<endl;
        return false;
    }

    // 遍历动态数组容器中的所有元素
    for(auto it = this->heros_inf_v->begin(); it != this->heros_inf_v->end(); it++)
    {
        cout<<"英雄姓名:"<<it->hero_name<<endl;
        cout<<"英雄技能:"<<it->hero_skill<<endl;
    }

    return true;
}